import json
import os.path
import requests
from lxml import etree

# 获取指点地点的经度和纬度的信息
def getPosition(address):
    # 所要爬取的网址，这里是百度地图API所提供的接口
    url="https://api.map.baidu.com/place/v2/search?query={}&region=秦皇岛&ak=这里改为自己的AK".format\
        (address)
    # 请求头信息的定制，为了处理UA反爬
    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/106.0.0.0 Safari/537.36 "
    }
    # 模拟浏览器请求，获取响应
    response = requests.get(url=url, headers=headers)
    # 使用BS4进行数据解析
    html_tree = etree.HTML(response.content)
    lat = html_tree.xpath("//lat[1]//text()")[0]
    lng = html_tree.xpath("//lng[1]//text()")[0]
    lat_lng=lat+","+lng
    return lat_lng


# 利用经度和纬度，以及百度地图接口，计算两个建筑之间距离。
def getDistance(startAdress, endAdress):
    # 所要爬取的网址，这里是百度地图API所提供的接口
    url = "https://api.map.baidu.com/routematrix/v2/walking?output=json&ak=这里改为自己的AK" \
          "={}&destinations={}".format(
        startAdress,  # 起始地点的经度和纬度
        endAdress,  # 终点的经度和纬度
    )
    # 请求头信息的定制
    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0."
                      "0.0 Safari/537.36"
    }
    # 模拟浏览器获取响应数据
    response=requests.get(url=url, headers=headers)
    content=response.text  # content是获取的是二进制数据，text是unicode="utf-8"类型的字符串
    content_json=json.loads(content)  # 使用json.loads()将json字符串反序列化变为一个Python对象
    distance=content_json["result"][0]["distance"]["value"]
    return distance


# 获取两个建筑之间的两两距离,并将数据保存在data.text
def getPlacesDistanceChart():
    # 要获取的建筑列表
    placesChart=["东校区大学生活动中心", "学生公寓1号楼", "学生公寓2号楼", "学生公寓3号楼", "学生公寓4号楼", "学生公寓5号楼",
                 "学生公寓6号楼", "学生公寓7号楼", "雁鸣湖餐厅", "世纪楼", "东区第一教学楼", "东区第三教学楼", "东区第四教学楼",
                 "东区图书馆", "机械馆", "体育馆"]
    # 获取列表的长度便
    longth = len(placesChart)
    # 定义一个而且列表，便于存放所得到的距离信息
    placesDistanceChart = [[0 for m in range(longth)] for n in range(longth)]
    # 为了程序的可用性，先判断该目录下是否有data.txt文件，如果有的话，先删除再重新创建存入邻接矩阵
    if os.path.exists("data.text"):
        os.remove("data.text")
    # 使用循环调用函数获取两地的经度和纬度，再调用getDistance()函数获取两个建筑之间的距离，并将获取的距离信息存入本地data.text文件中。
    for i in range(0, longth):
        for j in range(0, longth):
            if i!=j:
                address_start = "燕山大学" + placesChart[i]
                address_end = "燕山大学" + placesChart[j]
                lat_lng_start=getPosition(address_start)
                lat_lng_end=getPosition(address_end)
                distance =getDistance(lat_lng_start, lat_lng_end)
                with open("data.text", "a", encoding="utf-8")as fp:
                    fp.write(address_start+lat_lng_start+"到"+address_end+lat_lng_end+"距离为:"+str(distance)+"米"+"\n")
                placesDistanceChart[i][j] =distance
            else:
                address_start = "燕山大学" + placesChart[i]
                address_end = "燕山大学" + placesChart[j]
                with open("data.text", "a", encoding="utf-8") as fp:
                    fp.write(address_start + "到" + address_end + "距离为:0 米" + "\n")
                placesDistanceChart[i][i] =0
                break
    return placesDistanceChart


getPlacesDistanceChart()









